﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Mail;
using System.Xml;

//////////////////////////////////////////////////////////////////////////
// 功能：发送错误邮件的类。
// 作者：杨建祥
// 编写时间：2010/4/15
// 简述： 为了能将网站产生的错误通过邮件形式通知我们开发者，
//        所以编写了这个类，从而利于我们及时更正网站代码错误。
//////////////////////////////////////////////////////////////////////////
namespace WebSite.ErrorMails
{
    /// <summary>
    /// 发送错误信息到邮箱
    /// </summary>
    public class ErrorMailSend
    {
        MailMessage objMailMessage;
	    public ErrorMailSend()
	    {
            objMailMessage = new MailMessage(); 
            objMailMessage.From = "nkcollegehealth@gmail.com";//源邮件地址 
            objMailMessage.To = "rightyang89@gmail.com";//目的邮件地址，也就是发给我哈 
	    }

        /// <summary>
        /// 将错误信息以邮件方式发送给开发者
        /// </summary>
        /// <param name="ErrorMessage">错误信息</param>
        /// <param name="userid">用户ID</param>
        /// <param name="AtPage">发生错误的页面</param>
        /// <returns>如果成功发送，返回bool，如果发生异常，则返回false</returns>
        public bool SendErrorMail(string ErrorMessage,string userid,string AtPage)
        {
            try
            {
                objMailMessage.Subject = "[" + DateTime.Now.ToString() + "]Error From " + userid;
                objMailMessage.Body = "User: "+userid+"\nError Page: "+AtPage+"\n"+ErrorMessage;//发送邮件的内容 
                //接着利用sina的SMTP来发送邮件，需要使用Microsoft .NET Framework SDK v1.1和它以上的版本 
                //基本权限 
                objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
                //用户名 
                objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "nkcollegehealth");
                //密码 
                objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "software");
                //设置端口
                objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
                //增加SSL验证
                objMailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
                //SMTP地址 
                SmtpMail.SmtpServer = "smtp.gmail.com";
                //开始发送邮件 
                SmtpMail.Send(objMailMessage);
                //将错误信息保存到ErrorMessages.xml文件中
                WriteIntoXml(ErrorMessage, userid, AtPage);
                return true;
            }
            catch
            {
                //如果发送出了问题，则将错误信息存储到ErrorMessages.xml文件中。
                WriteIntoXml(ErrorMessage, userid, AtPage);
                return false;
            }
        }
        /// <summary>
        /// 将错误信息写入到本地XML文件中
        /// </summary>
        /// <param name="ErrorMessage">错误信息</param>
        /// <param name="userid">用户ID</param>
        /// <param name="AtPage">发生错误的页面</param>
        public  void WriteIntoXml(string ErrorMessage, string userid, string AtPage)
        {
          
           try
           {
               XmlDocument xmlDoc;
               xmlDoc = new XmlDocument();
               xmlDoc.Load(System.Web.HttpContext.Current.Server.MapPath("~\\WebSite\\ErrorMessages.xml"));
               XmlNode xmldocboot = xmlDoc.SelectSingleNode("Errors");

                //开始添加节点及节点的属性
               XmlElement ele = xmlDoc.CreateElement("Error");
               XmlElement ele1 = xmlDoc.CreateElement("UserId");
               ele1.InnerText = userid;
               XmlElement ele2 = xmlDoc.CreateElement("Time");
               ele2.InnerText = DateTime.Now.ToString();
               XmlElement ele3 = xmlDoc.CreateElement("AtPage");
               ele3.InnerText = AtPage;
               XmlElement ele4 = xmlDoc.CreateElement("ErrorMessage");
               ele4.InnerText = ErrorMessage;
               ele.AppendChild(ele2);
               ele.AppendChild(ele1);
               ele.AppendChild(ele3);
               ele.AppendChild(ele4);

               //将节点保存到根节点下
               xmldocboot.AppendChild(ele);
               //保存XML文件的修改-此处要注意，如果文件保存在系统盘，还要考虑用户权限的问题。
               xmlDoc.Save(System.Web.HttpContext.Current.Server.MapPath("~\\WebSite\\ErrorMessages.xml"));
           }
           catch
           {
               throw;
           }
        }
    }
}

